package com.yootk.di.service;

import com.yootk.di.config.MessageConfig;
import com.yootk.di.type.MessageSendStatus;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class MessageService implements AutoCloseable { // 消息的服务处理
    private static final Logger LOGGER = LoggerFactory.getLogger(MessageService.class);
    // 提醒：对于Map集合之中的KEY最好的方法就是使用String，如果要是自定义KEY，就需要HashCode()、equals()支持了
    private Map<String, MessageConfig> configs; // 这个类的执行需要config属性支持
    private MessageConfig currentConfig; // 当前使用的配置项
    private String currentKey; // 当前使用的KEY

    private boolean connect() { // 定义一个连接方法
        LOGGER.info("【{}】连接服务器：{}:{}", this.currentKey, this.currentConfig.getHost(), this.currentConfig.getPort());
        return this.currentConfig.isEnable(); // 通过enable的状态来决定是否连接成功
    }

    public MessageSendStatus send(String msg) { // 消息发送
        try {
            Iterator<Map.Entry<String, MessageConfig>> iterator =
                    this.configs.entrySet().iterator(); // 获取迭代对象
            while (iterator.hasNext()) {
                Map.Entry<String, MessageConfig> entry = iterator.next();
                this.currentKey = entry.getKey();
                this.currentConfig = entry.getValue(); // 【广播】向所有的通道进行消息发布
                if (this.connect()) {   // 消息发送之前需要首先连接服务器
                    LOGGER.info("【消息发送】{}", msg); // 日志记录
                    this.close(); // 关闭通道
                } else {
                    LOGGER.error("无法创建消息发送通道，消息发送失败。");
                }
            }
            return MessageSendStatus.SUCCESS; // 返回成功的状态
        } catch (Exception e) {
            LOGGER.error("消息发送产生异常：{}", e.getMessage());
            return MessageSendStatus.FAILURE; // 返回失败的状态
        }
    }
    // 此时该Bean（注册完成的类对象），之中的config属性需要通过配置文件定义注入管理


    public void setConfigs(Map<String, MessageConfig> configs) {
        this.configs = configs;
    }

    public Map<String, MessageConfig> getConfigs() {
        return configs;
    }

    @Override
    public void close() throws Exception {
        LOGGER.info("消息发送完毕，断开消息发送通道.");
    }
}
